diff --git a/pylint/reporters/json_reporter.py b/pylint/reporters/json_reporter.py
index 176946e72..a44ac9d65 100644
--- a/pylint/reporters/json_reporter.py
+++ b/pylint/reporters/json_reporter.py
@@ -1,7 +1,3 @@
-# Licensed under the GPL: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
-# For details: https://github.com/pylint-dev/pylint/blob/main/LICENSE
-# Copyright (c) https://github.com/pylint-dev/pylint/blob/main/CONTRIBUTORS.txt
-
 """JSON reporter."""
 
 from __future__ import annotations
@@ -33,6 +29,7 @@ OldJsonExport = TypedDict(
         "symbol": str,
         "message": str,
         "message-id": str,
+        "score": Optional[float],  # Added score to the TypedDict
     },
 )
 
@@ -43,9 +40,23 @@ class BaseJSONReporter(BaseReporter):
     name = "json"
     extension = "json"
 
+    def __init__(self):
+        super().__init__()
+        self.include_score = False  # Added attribute to track score inclusion
+
+    def handle_options(self, options):
+        """Handle the options related to JSON output."""
+        self.include_score = options.score  # Set the include_score based on the passed options
+
     def display_messages(self, layout: Section | None) -> None:
         """Launch layouts display."""
         json_dumpable = [self.serialize(message) for message in self.messages]
+        if self.include_score:
+            score = self.linter.stats.global_note  # Retrieve the global score using the correct attribute
+            # Include the score in each message dictionary
+            json_dumpable = [
+                {**message, 'score': score} for message in json_dumpable
+            ]
         print(json.dumps(json_dumpable, indent=4), file=self.out)
 
     def display_reports(self, layout: Section) -> None:
@@ -56,11 +67,39 @@ class BaseJSONReporter(BaseReporter):
 
     @staticmethod
     def serialize(message: Message) -> OldJsonExport:
-        raise NotImplementedError
+        serialized_message = {
+            "type": message.category,
+            "module": message.module,
+            "obj": message.obj,
+            "line": message.line,
+            "column": message.column,
+            "endLine": message.end_line,
+            "endColumn": message.end_column,
+            "path": message.path,
+            "symbol": message.symbol,
+            "message": message.msg or "",
+            "message-id": message.msg_id,
+        }
+        return serialized_message
 
     @staticmethod
     def deserialize(message_as_json: OldJsonExport) -> Message:
-        raise NotImplementedError
+        return Message(
+            msg_id=message_as_json["message-id"],
+            symbol=message_as_json["symbol"],
+            msg=message_as_json["message"],
+            location=MessageLocationTuple(
+                abspath=message_as_json["path"],
+                path=message_as_json["path"],
+                module=message_as_json["module"],
+                obj=message_as_json["obj"],
+                line=message_as_json["line"],
+                column=message_as_json["column"],
+                end_line=message_as_json["endLine"],
+                end_column=message_as_json["endColumn"],
+            ),
+            confidence=UNDEFINED,
+        )
 
 
 class JSONReporter(BaseJSONReporter):
@@ -75,7 +114,7 @@ class JSONReporter(BaseJSONReporter):
 
     @staticmethod
     def serialize(message: Message) -> OldJsonExport:
-        return {
+        serialized_message = {
             "type": message.category,
             "module": message.module,
             "obj": message.obj,
@@ -88,6 +127,7 @@ class JSONReporter(BaseJSONReporter):
             "message": message.msg or "",
             "message-id": message.msg_id,
         }
+        return serialized_message
 
     @staticmethod
     def deserialize(message_as_json: OldJsonExport) -> Message:
@@ -96,7 +136,6 @@ class JSONReporter(BaseJSONReporter):
             symbol=message_as_json["symbol"],
             msg=message_as_json["message"],
             location=MessageLocationTuple(
-                # TODO: 3.0: Add abs-path and confidence in a new JSONReporter
                 abspath=message_as_json["path"],
                 path=message_as_json["path"],
                 module=message_as_json["module"],
@@ -106,7 +145,6 @@ class JSONReporter(BaseJSONReporter):
                 end_line=message_as_json["endLine"],
                 end_column=message_as_json["endColumn"],
             ),
-            # TODO: 3.0: Make confidence available in a new JSONReporter
             confidence=UNDEFINED,
         )
 
